﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tibet.Datos.Interfaces;
using Tibet.Datos.FabricaDatos;
using Tibet.Entidades;
using Tibet.Entidades.FabricaEntidades;
using System.Data.SqlClient;

namespace Tibet.Datos.DaosSqlServer
{
    public class DaoSqlServerAccesoProyecto : IDaoAccesoProyecto
    {

        IDaoAccesoConexion bd = FabricaConexion.DaoSqlServerAccesoConexion();

        public List<Entidad> ConsultarProyectosInactivos()
        {

            SqlCommand command = new SqlCommand();
            List<Entidad> listaProyectos = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosProyectosInactivos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;



                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad proyecto = FabricaEntidades.ObtenerProyecto();
                    Entidad fecha = FabricaEntidades.ObtenerFecha();
                    List<Fecha> listaFechas = new List<Fecha>();
                    (proyecto as Proyecto).Id = reader.GetInt32(0);
                    (proyecto as Proyecto).Nombre = reader["NombreProyecto"].ToString();
                    (proyecto as Proyecto).Estatus = reader["Estatus"].ToString();
                    (proyecto as Proyecto).Ruta = reader["Ruta"].ToString();
                    (proyecto as Proyecto).Dias = reader.GetInt32(4);
                    (proyecto as Proyecto).IdPerfilRegla = reader.GetInt32(5);
                    (proyecto as Proyecto).IdPerfilMetrica = reader.GetInt32(6);
                    (proyecto as Proyecto).IdCliente = reader.GetInt32(7);
                    (fecha as Fecha).Fecha1 = DateTime.Parse(reader["Fecha"].ToString());

                    listaFechas.Add((fecha as Fecha));
                    (proyecto as Proyecto).Fechas = listaFechas;

                    listaProyectos.Add((proyecto as Proyecto));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaProyectos;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        public Entidad ConsultarProyectosPorId(int id)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoPorId]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", id);

                SqlDataReader reader = command.ExecuteReader();
                Entidad proyecto = FabricaEntidades.ObtenerProyecto();
                while (reader.Read())
                {
                    (proyecto as Proyecto).Id = reader.GetInt32(0);
                    (proyecto as Proyecto).Nombre = reader["NombreProyecto"].ToString();
                    (proyecto as Proyecto).Estatus = reader["Estatus"].ToString();
                    (proyecto as Proyecto).Ruta = reader["Ruta"].ToString();
                    (proyecto as Proyecto).Dias = reader.GetInt32(4);
                    if (reader.GetInt32(5) != null)
                        (proyecto as Proyecto).IdPerfilRegla = reader.GetInt32(5);
                    else
                        (proyecto as Proyecto).IdPerfilRegla = 0;

                    if (reader.GetInt32(6) != null)
                        (proyecto as Proyecto).IdPerfilMetrica = reader.GetInt32(6);
                    else
                        (proyecto as Proyecto).IdPerfilMetrica = 0;

                    if (reader.GetInt32(7) != null)
                        (proyecto as Proyecto).IdCliente = reader.GetInt32(7);
                    else
                        (proyecto as Proyecto).IdCliente = 0;
                }
                reader.Close();
                bd.CerrarConexionBd();
                return proyecto;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }



        public bool InsertarUpdateModificarProyecto2(Entidad proyecto)
        {
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPTProyectoModificar2]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", (proyecto as Proyecto).Id);
                command.Parameters.AddWithValue("@NombreProyecto", (proyecto as Proyecto).Nombre);
                command.Parameters.AddWithValue("@Ruta", (proyecto as Proyecto).Ruta);


               // command.Parameters.AddWithValue("@Fk_Perfil_Metrica_idPerfil_Metrica ", (proyecto as Proyecto).IdPerfilMetrica);



                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                // aqui realizaremos el insert en la tabla de fechas
                IngresarFecha2(proyecto);
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }

 
        }

        public bool InsertarUpdateModificarProyecto(Entidad proyecto)
        {

            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPTProyectoModificar]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", (proyecto as Proyecto).Id);
                command.Parameters.AddWithValue("@NombreProyecto", (proyecto as Proyecto).Nombre);
                command.Parameters.AddWithValue("@Ruta ", (proyecto as Proyecto).Ruta);


                command.Parameters.AddWithValue("@Fk_Perfil_Metrica_idPerfil_Metrica ", (proyecto as Proyecto).IdPerfilMetrica);



                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                // aqui realizaremos el insert en la tabla de fechas
                //--
                IngresarFecha2(proyecto as Proyecto);
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }

        public bool IngresarFecha2(Entidad proyecto)
        {
            SqlCommand command = new SqlCommand();

            bd.AbrirConexionBd();
            try
            {
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSFechaModificacionProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", (proyecto as Proyecto).Id);
                command.Parameters.AddWithValue("@Fecha", System.DateTime.Today);
                command.Parameters.AddWithValue("@Tipo", "Modificacion");
                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;
            }
            catch (Exception) { return false; }
        }


      

        public Entidad ConsultarClientePorId(int id)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELClientePorId]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@id", id);

                SqlDataReader reader = command.ExecuteReader();
                Entidad proyecto = FabricaEntidades.ObtenerCliente();
                while (reader.Read())
                {
                    (proyecto as Cliente).Nombre = reader["NombreCliente"].ToString();
                  
                }
                reader.Close();
                bd.CerrarConexionBd();
                return proyecto;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }


        public Entidad ConsultarPerfilMetricaPorId(int id)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELPerfilMetricaPorId]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@id", id);

                SqlDataReader reader = command.ExecuteReader();
                Entidad proyecto = FabricaEntidades.ObtenerPerfilMetrica();
                while (reader.Read())
                {
                    (proyecto as PerfilMetrica).NombrePerfilMetrica = reader["NombrePerfilMetrica"].ToString();

                }
                reader.Close();
                bd.CerrarConexionBd();
                return proyecto;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }


        public Entidad ConsultarPerfilReglaPorId(int id)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELPerfilReglaPorId]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@id", id);

                SqlDataReader reader = command.ExecuteReader();
                Entidad proyecto = FabricaEntidades.ObtenerPerfilReglas();
                while (reader.Read())
                {
                    (proyecto as Perfil_Regla).NombrePerfilRegla = reader["NombrePerfilRegla"].ToString();

                }
                reader.Close();
                bd.CerrarConexionBd();
                return proyecto;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        public Entidad ConsultarFechaPorProyecto(int id,string tipo)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELFechaPorProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@id", id);
                command.Parameters.AddWithValue("@tipo", tipo);

                SqlDataReader reader = command.ExecuteReader();
                Entidad fecha = FabricaEntidades.ObtenerFecha();
                while (reader.Read())
                {
                    (fecha as Fecha).Fecha1 = DateTime.Parse(reader["Fecha"].ToString());
                    (fecha as Fecha).Tipo = reader["Tipo"].ToString();

                }
                reader.Close();
                bd.CerrarConexionBd();
                return fecha;
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }



        public List<Entidad> ConsultarProyectosActivos()
        {

            SqlCommand command = new SqlCommand();
            List<Entidad> listaProyectos = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosProyectosActivos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;



                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad proyecto = FabricaEntidades.ObtenerProyecto();
                    Entidad fecha = FabricaEntidades.ObtenerFecha();
                    List<Fecha> listaFechas = new List<Fecha>();
                    (proyecto as Proyecto).Id = reader.GetInt32(0);
                    (proyecto as Proyecto).Nombre = reader["NombreProyecto"].ToString();
                    (proyecto as Proyecto).Estatus = reader["Estatus"].ToString();
                    (proyecto as Proyecto).Ruta = reader["Ruta"].ToString();
                    (proyecto as Proyecto).Dias = reader.GetInt32(4);
                    (proyecto as Proyecto).IdPerfilRegla = reader.GetInt32(5);
                    (proyecto as Proyecto).IdPerfilMetrica = reader.GetInt32(6);
                    (proyecto as Proyecto).IdCliente = reader.GetInt32(7);
                    (fecha as Fecha).Fecha1 = DateTime.Parse(reader["Fecha"].ToString());

                    listaFechas.Add((fecha as Fecha));
                    (proyecto as Proyecto).Fechas=listaFechas;

                    listaProyectos.Add((proyecto as Proyecto));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaProyectos;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }



        }

        public bool ArchivarProyecto(int id)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPTArchivarProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", id);

                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }

        public bool InsertarFechaCulminacionPorProyecto(int id)
        {

            SqlCommand command = new SqlCommand();
            string culminado = "Culminado";
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSFechaCulminacionPorProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Fecha", System.DateTime.Today);
                command.Parameters.AddWithValue("@Tipo", culminado);
                command.Parameters.AddWithValue("@idProyecto", id);

                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }


        /// <summary>
        /// Metodo que consulta todos los desarrolladores activos del sistema
        /// </summary>
        /// <returns></returns>
        public List<Entidad> ConsultarDesarrolladoresTodo()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaDesarrolladoresTodo = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosDesarrolladoresTodo]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10; //tiempo de verificacion, si tarda mucho la consulta

                SqlDataReader reader = command.ExecuteReader(); // ejecuta el stored procedure

                while (reader.Read())
                {
                    Entidad usuario = FabricaEntidades.ObtenerDesarrollador();
                    

                    (usuario as Usuario).Nombre = reader["NombreUsuario"].ToString();
                    (usuario as Usuario).Email = reader["CorreoElectronico"].ToString();
                    (usuario as Usuario).Rol.NombreRol = reader["NombreRol"].ToString();
                    //(usuario as Usuario).Roles.Add((rol as Rol));
                    listaDesarrolladoresTodo.Add((usuario as Usuario));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaDesarrolladoresTodo;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

        }



        /// <summary>
        /// Metodo que consulta los desarrollador de un proyecto en especifico.
        /// </summary>
        /// <param name="idProyecto">id del proyecto por el cual se realizara la busqueda</param>
        /// <returns>una lista con los desarrolladores del proyecto</returns>
        public List<Entidad> ConsultarDesarrolladoresPorProyecto(int idProyecto)
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaDesarrolladores = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELDesarrolladoresPorProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10; //tiempo de verificacion, si tarda mucho la consulta

                command.Parameters.AddWithValue("@IdProyecto", idProyecto);
                SqlDataReader reader = command.ExecuteReader(); // ejecuta el stored procedure

                while (reader.Read())
                {
                    Entidad usuario = FabricaEntidades.ObtenerDesarrollador();
                    Entidad rol = FabricaEntidades.ObtenerRol();
                    
                    
                    (usuario as Usuario).Nombre = reader["NombreUsuario"].ToString();
                    (usuario as Usuario).Email = reader["CorreoElectronico"].ToString();
                    (rol as Rol).NombreRol = reader["NombreRol"].ToString();
                    (usuario as Usuario).Rol=(rol as Rol);
                    listaDesarrolladores.Add((usuario as Usuario));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaDesarrolladores;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

        }

        /// <summary>
        /// Metodo que consulta todos los proyectos que estan activos para ser modificados.
        /// </summary>
        /// <returns>retorna una lista con los proyectos y sus fechas de modificacion</returns>
        public List<Entidad> ConsultarTodoLosProyectosAModificar()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaProyectos = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosProyectosModificar]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10; //tiempo de verificacion, si tarda mucho la consulta

                SqlDataReader reader = command.ExecuteReader(); // ejecuta el stored procedure

                while (reader.Read())
                {
                    Entidad proyecto = FabricaEntidades.ObtenerProyecto();
                   // Entidad fecha = FabricaEntidades.ObtenerFecha();
                    //Entidad cliente = FabricaEntidades.ObtenerCliente();
                    (proyecto as Proyecto).Id = reader.GetInt32(0);
                    (proyecto as Proyecto).IdCliente = reader.GetInt32(1);
                    (proyecto as Proyecto).Nombre = reader["NombreProyecto"].ToString();
                    (proyecto as Proyecto).Estatus = reader["NombreCliente"].ToString();
                    (proyecto as Proyecto).Ruta = reader["Fecha"].ToString(); // preguntar como meter el cliente en la lista de proyectos
                    //(fecha as Fecha).Fecha1 = DateTime.Parse(reader["Fecha"].ToString());
                    //(proyecto as Proyecto).Fechas.Add((fecha as Fecha));
                    listaProyectos.Add((proyecto as Proyecto));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaProyectos;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

        }

        //jenny
        public List<Entidad> ConsultarTodosPerfilRegla()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaPerfilReglas = new List<Entidad>();
            try
            {


                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosPerfilReglas]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;



                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {

                    Entidad perfilregla = FabricaEntidades.ObtenerPerfilReglas();
                    (perfilregla as Perfil_Regla).NombrePerfilRegla = reader["NombrePerfilRegla"].ToString();
                    (perfilregla as Perfil_Regla).IdPerfilRegla = reader.GetInt32(0);
                    listaPerfilReglas.Add((perfilregla as Perfil_Regla));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaPerfilReglas;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        //jenny
        public List<Entidad> ConsultarTodosClientes()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaClientes = new List<Entidad>();
            try
            {


                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELClientesJ]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;



                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {

                    Entidad clientes = FabricaEntidades.ObtenerCliente();
                    (clientes as Cliente).Nombre = reader["NombreCliente"].ToString();
                    (clientes as Cliente).Id =  reader.GetInt32(1);
                    listaClientes.Add((clientes as Cliente));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaClientes;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        /// <summary>
        /// Metodo inserta la fecha en que se modifico un proyecto.
        /// </summary>
        /// <param name="id">es el id del proyecto ha modificar en la tabla fechas</param>>
        /// <returns>retorna true si la insercion se hizo, sino false</returns>
        public bool InsertarFechaModificacionProyecto(int id)
        {
            SqlCommand command = new SqlCommand();
            string modificar = "Modificacion";
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPTArchivarProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Fecha", System.DateTime.Today);
                command.Parameters.AddWithValue("@Tipo", modificar);
                command.Parameters.AddWithValue("@idProyecto", id);

                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (TimeoutException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }
        //Jenny
        /// <summary>
        /// Metodo devuelve una lista de los desarrolladores disponibles para un proyecto.
        /// </summary>
        /// <returns>Lista de los desarrolladores</returns>
        public List<Entidad> ConsultarDesarrolladoresParaProyecto()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaDesarrolladoresDisponibles = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosUsuarios]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10; //tiempo de verificacion, si tarda mucho la consulta

                SqlDataReader reader = command.ExecuteReader(); // ejecuta el stored procedure

                while (reader.Read())
                {
                    Entidad usuarios = FabricaEntidades.ObtenerDesarrollador();

                    (usuarios as Usuario).Nombre = reader["NombreUsuario"].ToString();
                    (usuarios as Usuario).Apellido= reader["ApellidoUsuario"].ToString();
                    (usuarios as Usuario).IdUsuario = reader.GetInt32(2);
                    listaDesarrolladoresDisponibles.Add((usuarios as Usuario));
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaDesarrolladoresDisponibles;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

        }

        //Jenny
        /// <summary>
        /// Metodo devuelve una lista de los roles disponibles para un desarrollador.
        /// </summary>
        /// <returns>Lista de roles</returns>
        public List<Entidad> ConsultarRolesParaProyecto()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaRoles = new List<Entidad>();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELRolesDesarrolladores]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10; //tiempo de verificacion, si tarda mucho la consulta

                SqlDataReader reader = command.ExecuteReader(); // ejecuta el stored procedure

                while (reader.Read())
                {
                    Entidad roles = FabricaEntidades.ObtenerRol();

                    (roles as Rol).NombreRol = reader["NombreRol"].ToString();
                    (roles as Rol).IdRol = reader.GetInt32(1);
                    listaRoles.Add(roles as Rol);
                   
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaRoles;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

        }





        ///oscar
        /*
        public bool InsertarUpdateModificarProyecto(Entidad proyecto)
        {

            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPTProyectoModificar]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProyecto", (proyecto as Proyecto).Id);
                command.Parameters.AddWithValue("@NombreProyecto", (proyecto as Proyecto).Nombre);
                command.Parameters.AddWithValue("@Ruta ", (proyecto as Proyecto).Ruta);
               
                
                command.Parameters.AddWithValue("@Fk_Perfil_Metrica_idPerfil_Metrica ", (proyecto as Proyecto).IdPerfilMetrica);
                


                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }

        */

        //JENNY
        /// <summary>
        /// Metodo inserta un proyecto.
        /// </summary>
        /// <returns>retorna true si la insercion se hizo correctamente, sino false</returns>
        
        public bool InsertarProyecto(Entidad proyecto)
        {

            SqlCommand command = new SqlCommand();
           
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Estatus", (proyecto as Proyecto).Estatus);
                command.Parameters.AddWithValue("@NombreProyecto", (proyecto as Proyecto).Nombre);
                command.Parameters.AddWithValue("@Ruta ", (proyecto as Proyecto).Ruta);
                command.Parameters.AddWithValue("@Dias ", (proyecto as Proyecto).Dias);
                command.Parameters.AddWithValue("@Fk_Perfil_Regla_idPerfil_Regla  ", (proyecto as Proyecto).IdPerfilRegla);
                command.Parameters.AddWithValue("@Fk_Perfil_Metrica_idPerfil_Metrica ", (proyecto as Proyecto).IdPerfilMetrica);
                command.Parameters.AddWithValue("@Fk_Cliente_idCliente ", (proyecto as Proyecto).IdCliente);
	        

                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }

        public int ConsultaUltimoProyecto()
        {
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELMaxProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;



                SqlDataReader reader = command.ExecuteReader();
                int ULTIMOPROYECTO = 0;
                while (reader.Read())
                {
                    ULTIMOPROYECTO = reader.GetInt32(0);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return ULTIMOPROYECTO;
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }


        }

        public bool InsertarFechaDeProyecto(int id)
        {
            SqlCommand command = new SqlCommand();

            try
            {

                string tipo = "Creacion";
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSFechaProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Fecha", System.DateTime.Today);
                command.Parameters.AddWithValue("@Tipo", tipo);
                command.Parameters.AddWithValue("@Fk_Proyecto_idProyecto ", id);



                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }

        public bool InsertarUsuariosProyecto(int idProyecto, int idDesarrollador, int idRol)
        {
            SqlCommand command = new SqlCommand();

            try
            {

              
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSUsuarioProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Fk_Usuario_idUsuario", idDesarrollador);
                command.Parameters.AddWithValue("@Fk_Proyecto_idProyecto", idProyecto);
                command.Parameters.AddWithValue("@Fk_Rol_idRol ", idRol);



                SqlDataReader reader = command.ExecuteReader();
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }


        }

        #region Integracion SVN
        /// <summary>
        /// devuelve el id del proyecto al que pertenece el usuario
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int FuncConsultarIdProyecto(int idUsuario)
        {

            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELidProyecto.sql]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idUsuario", idUsuario);
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    int strUsuario = Convert.ToUInt16(reader.GetValue(0));
                    return strUsuario;
                }

                reader.Close();
                bd.CerrarConexionBd();
                return 0;
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }
        }
        #endregion

    }
}
